/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package proyecto.web;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import proyecto.service.EmpleadoService;
import proyecto.modelo.Empleado;
import proyecto.excepcion.DAOExcepcion;
import proyecto.excepcion.LoginExcepcion;
import proyecto.modelo.Cargo;
import proyecto.modelo.Area;


/**
 *
 * @author Administrador
 */
public class EmpleadoController extends MultiActionController {

    public EmpleadoController() {
        //Initialize controller properties here or
        //in the Web Application Context
        //setCommandClass(MyCommand.class);
        //setCommandName("MyCommandName");
        //setSuccessView("successView");
        //setFormView("formView");
    }

    //@Override
    protected void doSubmitAction(Object command) throws Exception {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    //Use onSubmit instead of doSubmitAction
    //when you need access to the Request, Response, or BindException objects
    /*
    @Override
    protected ModelAndView onSubmit(
    HttpServletRequest request,
    HttpServletResponse response,
    Object command,
    BindException errors) throws Exception {
    ModelAndView mv = new ModelAndView(getSuccessView());
    //Do something...
    return mv;
    }
     */
    private EmpleadoService empleadoService;

    public EmpleadoService getEmpleadoService() {
        return empleadoService;
    }

    public void setEmpleadoService(EmpleadoService empleadoService) {
        this.empleadoService = empleadoService;
    }

    public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("/MantenimientoEmpleado");
    }

    public ModelAndView buscar(HttpServletRequest request, HttpServletResponse response) {
        String nombres = request.getParameter("descripcion");

        try {

            Collection<Empleado> empleados = empleadoService.buscarPorNombre(nombres);

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(empleados);
            out.println(tabla);
            out.close();

            request.setAttribute("empleados", empleados);
        } catch (IOException ex) {
            Logger.getLogger(EmpleadoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion ex) {
            System.err.println(ex.toString());
        }
        return null;
    }

    public ModelAndView nuevo(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("/MantenimientoEmpleado");
    }

    public ModelAndView insertar(HttpServletRequest request, HttpServletResponse response) {
        Empleado vo = new Empleado();
        vo.setEmp_Codigo(request.getParameter("codigo"));
        vo.setEmp_Nombre(request.getParameter("nombre"));
        vo.setEmp_ApellidoPaterno(request.getParameter("apPaterno"));
        vo.setEmp_ApellidoMaterno(request.getParameter("apMaterno"));
        vo.setEmp_Contrasena(request.getParameter("clave"));
        vo.setEmp_Sexo(request.getParameter("sexo"));
        vo.setEmp_Jefe(request.getParameter("jefe"));
        vo.setEmp_Sueldo(Double.parseDouble(request.getParameter("sueldo")));

        //vo.setEmp_FechaNacimiento(Date.valueOf(request.getParameter("fechaNac")));
        //vo.setEmp_FechaIngreso(Date.valueOf(request.getParameter("fechaIng")));

        Area area = new Area();
        area.setAre_Codigo(Integer.parseInt(request.getParameter("area")));

        Cargo cargo = new Cargo();
        cargo.setCar_Codigo(Integer.parseInt(request.getParameter("cargo")));

        vo.setArea(area);
        vo.setCargo(cargo);

        try {
            empleadoService.insertar(vo);

            Collection<Empleado> empleados = empleadoService.buscarPorNombre("");

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(empleados);
            out.println(tabla);
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(EmpleadoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion e) {
            System.err.println(e.toString());
        }
        //buscar( request,  response);
        return new ModelAndView("redirect:/MantenimientoArea.htm");
    }

    public ModelAndView eliminar(HttpServletRequest request, HttpServletResponse response) {
        String codigo = request.getParameter("codigo");
        try {
            empleadoService.eliminar(codigo);

            Collection<Empleado> empleados = empleadoService.buscarPorNombre("");

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(empleados);
            out.println(tabla);
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(EmpleadoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion ex) {
            System.err.println(ex.toString());
        }
        return new ModelAndView("redirect:/MantenimientoEmpleado.htm");
    }

    public ModelAndView obtener(HttpServletRequest request, HttpServletResponse response) {
        String codigo = request.getParameter("codigo");
        Empleado vo;
        try {
            vo = empleadoService.obtener(codigo);

            //Construye el objeto JSON  a partir del objeto recuperado
            Gson gson = new GsonBuilder().setPrettyPrinting().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
            ArrayList objeto = new ArrayList(0);
            objeto.add(vo);
            String instancia = gson.toJson(objeto);

            PrintWriter out = response.getWriter();
            //Construye un objeto con los datos
            out.println(instancia);
            out.close();

            request.setAttribute("Empleado", vo);
        } catch (IOException ex) {
            Logger.getLogger(EmpleadoController.class.getName()).log(Level.SEVERE,
                    null, ex);

        } catch (DAOExcepcion e) {
            System.err.println("Error");
        }
        return new ModelAndView("redirect:/MantenimientoEmpleado.htm");
    }

    public ModelAndView actualizar(HttpServletRequest request, HttpServletResponse response) {

        Empleado vo = new Empleado();

        vo.setEmp_Codigo(request.getParameter("codigo"));
        vo.setEmp_Nombre(request.getParameter("nombre"));
        vo.setEmp_ApellidoPaterno(request.getParameter("apPaterno"));
        vo.setEmp_ApellidoMaterno(request.getParameter("apMaterno"));
        vo.setEmp_Contrasena(request.getParameter("clave"));
        vo.setEmp_Sexo(request.getParameter("sexo"));
        vo.setEmp_Jefe(request.getParameter("jefe"));
        vo.setEmp_Sueldo(Double.parseDouble(request.getParameter("sueldo")));

        //vo.setEmp_FechaNacimiento(Date.valueOf(request.getParameter("fechaNac")));
        //vo.setEmp_FechaIngreso(Date.valueOf(request.getParameter("fechaIng")));

        Area area = new Area();
        area.setAre_Codigo(Integer.parseInt(request.getParameter("area")));

        Cargo cargo = new Cargo();
        cargo.setCar_Codigo(Integer.parseInt(request.getParameter("cargo")));

        vo.setArea(area);
        vo.setCargo(cargo);


        try {
            empleadoService.actualizar(vo);

            Collection<Empleado> empleados = empleadoService.buscarPorNombre("");

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(empleados);
            out.println(tabla);
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(EmpleadoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion e) {
            System.err.println("Error");
        }
        return new ModelAndView("redirect:/MantenimientoEmpleado.htm");
    }

    private String doLLenarTabla(Collection<Empleado> empleados) {

        String codigo = "";
        String nombre = "";
        String apPaterno = "";
        String apMaterno = "";
        String cargo = "";

        String cabecera = "<table class='datos'>" +
                "<tr class='Estilo9 Estilo12'>" +
                "<th>C&oacute;digo</th>" +
                "<th>Nombres</th>" +
                "<th>Ap. Paterno</th>" +
                "<th>Ap. Materno</th>" +
                "<th>Cargo</th>" +
                "<th>&nbsp;</th>" +
                "<th>&nbsp;</th></tr>";

        String celdas = "";

        for (Empleado e : empleados) {

            codigo = e.getEmp_Codigo().toString();
            nombre = e.getEmp_Nombre();
            apPaterno = e.getEmp_ApellidoPaterno();
            apMaterno = e.getEmp_ApellidoMaterno();
            cargo = e.getCargo().getCar_Descripcion();
            celdas = celdas +
                    "<tr>" +
                    "<td ><span class=\"Estilo12\">" + codigo + "</span></td>" +
                    "<td ><span class=\"Estilo12\">" + nombre + "</span></td>" +
                    "<td ><span class=\"Estilo12\">" + apPaterno + "</span></td>" +
                    "<td ><span class=\"Estilo12\">" + apMaterno + "</span></td>" +
                    "<td ><span class=\"Estilo12\">" + cargo + "</span></td>" +
                    "<td><a onclick=\"return empleadoObtener('" + codigo + "');\"><img src=\"imagenes/b_edit.gif\" alt=\"Editar\" title=\"Editar\" /></a></td>" +
                    "<td><a onclick=\"return empleadoEliminar('" + codigo + "');\"><img src=\"imagenes/delete.png\" alt=\"Editar\" title=\"Editar\" /></a></td>" +
                    "</tr>";
        }

        String tabla = cabecera + celdas + "</table>";

        return tabla;
    }

    public ModelAndView listar(HttpServletRequest request, HttpServletResponse response) {

        try {

            Collection<Empleado> empleados = empleadoService.listar();

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarCombo(empleados);
            out.println(tabla);
            out.close();

            request.setAttribute("empleados", empleados);
        } catch (IOException ex) {
            Logger.getLogger(CargoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion ex) {
            System.err.println(ex.toString());
        }
        return null;
    }

    private String doLLenarCombo(Collection<Empleado> empleados) {

        String codigo = "";
        String desc = "";

        String combo = "<select name=\"cboEmpleado\" id=\"cboEmpleado\">";

        for (Empleado e : empleados) {
            codigo = e.getEmp_Codigo();
            desc = e.getNombreCompleto();
            combo = combo +
                    "<option value=\"" + codigo + "\">" + desc + "</option>";
        }

        combo = combo + "</select>";

        return combo;
    }

    public ModelAndView login(HttpServletRequest request, HttpServletResponse response) {

        ModelAndView mv = null;

        String u = request.getParameter("codusuario");
        String p = request.getParameter("pwdusuario");
        System.out.println(u);
        System.out.println(p);
        try {
            Empleado vo = empleadoService.validar(u, p);
            HttpSession session = request.getSession();
            session.setAttribute("USUARIO_ACTUAL", vo);
            mv = new ModelAndView("redirect:/principal.htm");
        } catch (DAOExcepcion ex) {
            System.err.println(ex.toString());
            mv = new ModelAndView("error");
        } catch (LoginExcepcion ex) {
            System.out.println(ex.toString());
            mv = new ModelAndView("error");
        }
        return mv;
    }
}